package com.goa.core;

import com.goa.cache.SessionMap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.net.SocketAddress;

/**
 * 注册包或者心跳包token校验拦截器
 */
@Slf4j
public class TokenAuthHandler extends ChannelInboundHandlerAdapter {


    /**
     * 第一次连接时的处理器，可以设置一些黑名单进行禁止连接
     * @param ctx
     * @throws Exception
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        //黑名单拦截逻辑
        //*******
        super.handlerAdded(ctx);
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //首先进行缓存校验token
        Channel channel = ctx.channel();
        //设备地址
        SocketAddress socketAddress = channel.remoteAddress();
        log.info("进入token校验业务,设备地址{}",socketAddress);
        //根据当前信道，在map集合中查询是否存在
        Channel ch = SessionMap.passCliendMap.get(socketAddress);
        if (ch!=null){
            //已校验过的token
            log.info("该设备是已信任设备,不进行token校验,地址={}",socketAddress);
            // Token 合法，继续传递消息到下一个 Handler
            super.channelRead(ctx, msg);
            return;
        }
        // 校验 token  
        if (!validateToken((String) msg)) {
            // Token 不合法，关闭连接或发送错误响应
            ctx.close();
            // ctx.writeAndFlush(new UnauthenticatedResponseMessage());
            int clientSize = NettyServerHandler.channelGroup.size();
            log.info("token校验失败，强制关掉连接,地址是{},当前的连接数是{}",socketAddress,clientSize);
            return;  
        }
        SessionMap.passCliendMap.put(socketAddress,channel);
        log.info("当前设备token校验通过，添加到Map集合，地址={}",socketAddress);
        // Token 合法，继续传递消息到下一个 Handler
        super.channelRead(ctx, msg);  
    }

    /**
     * 验证token逻辑是否通过 通过进行下一个handler;
     * @param token
     * @return
     */
    private boolean validateToken(String token) {  
        //需要实现 Token 验证逻辑 ，利用通过设备号。唯一标识进行加密
        return "000000".equals(token);
    }  
}